5190. Построить треугольник по двум сторонам и углу

 

Постройте треугольник по двум сторонам и углу между ними.

 

Вход. Три действительных числа – длины двух сторон треугольника и величину угла между ними в градусах. Длины сторон – положительные числа, не превосходящие 104, угол – положительное число меньшее 180.

 

Выход. Выведите 6 действительных чисел – координаты вершин какого-нибудь треугольника соответствующего входным данным с точностью не менее 6 десятичных знаков.

 

Пример входа

Пример выхода

10 5 60

0 0

10.0 0

2.5000000000 4.3301270189

 

 

РЕШЕНИЕ

геометрия

 

Анализ алгоритма

Пусть A, B, C – три вершины треугольника, BC = a, AC = b. Расположим начало системы координат (0, 0) в точке С, ось абсцисс направим вдоль вектора CB. Тогда точка B имеет координаты (a, 0).

Проведем высоту AK. Из треугольника CAK: AK = AC sin φ, CK = AC cos φ. Учитывая что AC = b, точка А будет имеет координаты (b cos φ, b sin φ).

 

Реализация алгоритма

Объявим константу π.

 

#define PI acos(-1.0)

 

Читаем входные данные.

 

scanf("%lf %lf %lf",&a,&b,&fi);

 

Преобразуем угол fi в радианы.

 

fi = fi / 180 * PI;

 

Выводим координаты трех точек.

 

printf("%.6lf %.6lf\n",0,0);

printf("%.6lf %.6lf\n",a,0);

printf("%.6lf %.6lf\n",b*cos(fi),b*sin(fi));

 

Java реализация

 

import java.util.*;

 

public class Main

{

  static double[] kramer(double a1, double b1, double c1,

                         double a2, double b2, double c2)

  {

    double res[] = new double[2]; // x, y     

    double d = a1 * b2 - a2 * b1;

    double dx = c1 * b2 - c2 * b1;

    double dy = a1 * c2 - a2 * c1;

 

    res[0] = dx / d;

    res[1] = dy / d;

    return res;

  }

  public static void main(String []args)

  {

    Scanner con = new Scanner(System.in);

    double a = con.nextDouble();

    double b = con.nextDouble();

    double fi = con.nextDouble();

 

    fi = fi / 180 * Math.PI;

    System.out.println("0 0");

    System.out.println(a + " " + 0);

    System.out.println(b * Math.cos(fi) + " " + b * Math.sin(fi));

 

    con.close();

  }

}